/*
 *https://www.luogu.com.cn/problem/P1443
 *洛谷P1443. 马的遍历
 *medium 吴朝泽 2024.12.2
 *BFS广度优先搜索
*/

#include<bits/stdc++.h>
using namespace std;
int xx[] = { 2, 2, 1, 1, -1, -1, -2, -2 };   //设置马可走的八个方向
int yy[] = { 1, -1, 2, -2, -2, 2, -1, 1 };
int n, m, sx, sy;
int mp[405][405];     //存储步数

struct node   
{
	int x, y, s;   //定义结构体存储每一次的横、纵坐标和步数
};

int main()
{
	cin >> n >> m >> sx >> sy;
	memset(mp, -1, sizeof(mp));  //题意是如果没遍历到该点就输出 -1，先初始化为 -1，自带 vis 数组的效果
	queue<node> que;      //定义结构体类型的队列
	node t;
	t.x = sx;  t.y = sy;  t.s = 0;
	que.push(t);
	mp[sx][sy] = 0;      //初始化起点，不为 -1
	while (!que.empty())
	{
		for (int i = 0; i < 8; ++i)
		{
			int dx = que.front().x + xx[i];
			int dy = que.front().y + yy[i];
			if (dx >= 1 && dx <= n && dy >= 1 && dy <= m && mp[dx][dy] == -1)    //判断是否出界 && 是否第一次遍历该点
			{
				node k;
				k.x = dx;  k.y = dy;  k.s = que.front().s + 1;
				que.push(k);
				mp[dx][dy] = k.s;
			}
		}
		que.pop();
	}
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= m; ++j)
		{
			cout << left << setw(5) << mp[i][j];    //格式输出，左端对齐，间隔为 5
		}
		cout << endl;
	}
	return 0;
}